package com.gzsxy.sso.core.utils;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gzsxy.sso.common.exception.impl.BusinessException;
import com.gzsxy.sso.common.result.ResultCodeEnum;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;

import java.util.function.BiFunction;
import java.util.function.Function;


/**
 * @author xiaolong
 * @version 1.0
 * @description: 校验工具
 * @date 2021/12/2 16:54
 */
public class ValidateUtil {



    /**
     * @description: 唯一性校验，若查询方法返true则表示该值已存在，抛出异常返回错误码
     * @param queryFunc 数据库查询方法
     * @param input 校验对象
     * @param errorMsg 错误信息
     * @return
     */
    public static void assertUnique(Function<String,Boolean> queryFunc, String input, String errorMsg){
        if (queryFunc.apply(input)){
            throw new BusinessException(errorMsg);
        }
    }

    /**
     * @description: 判断表达式是否为false，不为false时抛出异常
     * @param expression 表达式
     * @param errorMsg 错误代码
     * @return
     */
    public static void isFalse(Boolean expression,String errorMsg){
        //不为false时抛出异常
        if (BooleanUtils.isNotFalse(expression)){
            throw new BusinessException(errorMsg);
        }
    }

    /**
     * @description: 校验ID在数据库是否存在
     * @param mapper 数据表mapper
     * @param id id
     * @param errorMsg 错误信息
     * @return
     */
    public static <T> void isExist(BaseMapper<T> mapper,String id,String errorMsg){
        isNotEmpty(mapper.selectById(id),errorMsg);
    }

    /**
     * @description: 非空校验，对象为空抛出异常
     * @param  object 校验对象
     * @param  errorMsg 错误信息
     * @return
     */
    public static void isNotEmpty(Object object,String errorMsg){
        if (ObjectUtils.isEmpty(object)){
            throw new BusinessException(errorMsg);
        }
    }

    /**
     * @description: 唯一性校验，若查询方法的返回值true则表示该值已存在，抛出异常返回错误码
     * @param queryFunc 数据库查询方法
     * @param param1 参数1
     * @param param2 参数2
     * @param errorMsg 错误代码
     * @return
     */
    public static void assertUnique(BiFunction<String,String,Boolean> queryFunc,String param1,String param2,String errorMsg){
        if (queryFunc.apply(param1,param2)){
            throw new BusinessException(errorMsg);
        }

    }


}
